home *** CD-ROM | disk | FTP | other *** search
/ ftp.mactech.com 2010 / ftp.mactech.com.tar / ftp.mactech.com / machack / Hacks97 / NewsTicker.sit / NewsTicker / source code / WindowStuff / jGNELib.c < prev    next >
Text File  |  1997-06-20  |  4KB  |  144 lines

  1. /*------------------------------------------------------------------------------
  2. #
  3. #    jGNE Hookup Code Resource Library
  4. #
  5. #    jGNELib.c    - Library for using the jgne code resource
  6. #
  7. #    Copyright © CE Software, Inc., Inc. 1996-97
  8. #    All rights reserved.
  9. #
  10. ------------------------------------------------------------------------------*/
  11. #include "jGNELib.h"
  12.  
  13. // Here's all the stuff for talking to our 68k library
  14.  
  15. #define kGNEHandlerGestaltType 'jGNE'
  16. #define kGNEHandlerResType 'CECD'
  17. #define kGNEHandlerResID 10
  18.  
  19. typedef pascal void (*GNEHandlerActionProcPtr)(short theAction, 
  20.                                                 long thejGNEProc, 
  21.                                                 long refcon);
  22.                                                 
  23. typedef pascal void (*GNEHandlerInitProcPtr)(void);
  24.  
  25. #if GENERATINGCFM    
  26.     enum 
  27.         {
  28.         uppGNEHandlerInitInfo = kPascalStackBased,
  29.         uppGNEHandlerInfo = kPascalStackBased
  30.             | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(short)))
  31.             | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(long)))
  32.             | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(long)))
  33.         };
  34.     typedef UniversalProcPtr GNEHandlerInitUPP;
  35.     typedef UniversalProcPtr GNEHandlerUPP;
  36.     #define NewGNEHandlerInitProc(userRoutine)    \
  37.         (GNEHandlerInitUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppGNEHandlerInitInfo, (ISAType)kM68kISA)
  38.     #define NewGNEHandlerProc(userRoutine)    \
  39.         (GNEHandlerUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppGNEHandlerInfo, (ISAType)kM68kISA)
  40.     #define CallGNEHandlerInitProc(userRoutine)    \
  41.         CallUniversalProc((UniversalProcPtr)(userRoutine), uppGNEHandlerInitInfo)
  42.     #define CallGNEHandlerProc(userRoutine, param1, param2, param3)    \
  43.         CallUniversalProc((UniversalProcPtr)(userRoutine), uppGNEHandlerInfo, param1, param2, param3)
  44. #else
  45.     typedef GNEHandlerInitProcPtr GNEHandlerInitUPP;
  46.     typedef GNEHandlerActionProcPtr GNEHandlerUPP;
  47.     #define NewGNEHandlerInitProc(userRoutine)         ((GNEHandlerInitUPP) (userRoutine))
  48.     #define NewGNEHandlerProc(userRoutine)            ((GNEHandlerUPP) (userRoutine))
  49.     #define CallGNEHandlerInitProc(userRoutine)        (*(userRoutine)) ()
  50.     #define CallGNEHandlerProc(userRoutine, param1, param2, param3)    \
  51.         (*(userRoutine)) ((param1), (param2), (param3))
  52. #endif
  53.  
  54. static GNEHandlerUPP GetGNEHandlerUPP(void)
  55.     {
  56.     static GNEHandlerUPP         GNEHandler = nil;
  57.     
  58.     GNEHandlerActionProcPtr        GNEHandlerProc;
  59.     OSErr                        error;
  60.     Handle                        hCodeProc;
  61.     GNEHandlerInitUPP            GNEHandlerInit;
  62.     
  63.     if (GNEHandler)
  64.         return GNEHandler;
  65.         
  66.     // Try to get hot key proc ptr from Gestalt selector.
  67.     error = Gestalt(kGNEHandlerGestaltType, (long*)&GNEHandlerProc);
  68.     if (error || !GNEHandlerProc)
  69.         {
  70.         // Load hot key code resource.
  71.         hCodeProc = Get1Resource(kGNEHandlerResType, kGNEHandlerResID);
  72.         if (!hCodeProc)
  73.             return nil;
  74.             
  75.         // Lock it, dereference it, build its UPP, and jump right in.
  76.         HLock(hCodeProc);
  77.         GNEHandlerInit = NewGNEHandlerInitProc(*hCodeProc);
  78.         CallGNEHandlerInitProc(GNEHandlerInit);
  79.         // DO NOT UNLOCK, DETACH, OR RELEASE the hCodeProc because the init code has locked it down itself and it must not move!
  80.         DisposeRoutineDescriptor(GNEHandlerInit);
  81.         // Now we should be able to get the hot key proc ptr from the Gestalt selector.
  82.         error = Gestalt(kGNEHandlerGestaltType, (long*)&GNEHandlerProc);
  83.         if (error || !GNEHandlerProc)
  84.             return nil;
  85.         }
  86.         
  87.     // We now know that we have a non-nil hot key proc ptr.
  88.     // Generate its routine descriptor and return it.
  89.     GNEHandler = NewGNEHandlerProc(GNEHandlerProc);
  90.     return GNEHandler;
  91.     }
  92.     
  93. // This refers to our hook routine
  94. typedef pascal Boolean (*jEventProcPtr)(EventRecord* event, long refcon);
  95.  
  96. #if GENERATINGCFM    
  97.     enum 
  98.         {
  99.         uppHookCallInfo = kPascalStackBased
  100.             | RESULT_SIZE(SIZE_CODE(sizeof(short)))
  101.             | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(long)))
  102.             | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(long)))
  103.         };
  104.     typedef UniversalProcPtr GNEHookUPP;
  105.     
  106.     #define NewGNEHookProc(userRoutine)    \
  107.         (GNEHookUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppHookCallInfo, (ISAType)kPowerPCISA)
  108. #else
  109.     typedef jEventProcPtr GNEHookUPP;
  110.     #define NewGNEHookProc(userRoutine)            ((GNEHookUPP) (userRoutine))
  111. #endif
  112.  
  113.  
  114. void InitjGNEProcLib(void)
  115. {
  116.     GetGNEHandlerUPP();
  117. }
  118.  
  119.  
  120. void    HookjGNE(long thejGNEProc, long    refcon)
  121. {
  122.     GNEHandlerUPP         jGNEProc;
  123.     
  124.     jGNEProc = GetGNEHandlerUPP();
  125.     if (!jGNEProc)
  126.         return;
  127.     
  128.     CallGNEHandlerProc(jGNEProc, 1, (long)NewGNEHookProc(thejGNEProc), refcon);
  129. }
  130.  
  131.  
  132. void    UnHookjGNE(void)
  133. {
  134.     GNEHandlerUPP         jGNEProc;
  135.     
  136.     jGNEProc = GetGNEHandlerUPP();
  137.     if (!jGNEProc)
  138.         return;
  139.     
  140.     CallGNEHandlerProc(jGNEProc, 2, 0, 0);
  141. }
  142.  
  143.  
  144.